package controller

import (
	"github.com/example/video_backend/internal/service"
	"github.com/example/video_backend/pkg/logger"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

// Response 统一响应结构体

// ImageController 图片控制器
type ImageController struct {
	imageService service.ImageService
}

// NewImageController 创建图片控制器实例
func NewImageController(imageService service.ImageService) *ImageController {
	return &ImageController{
		imageService: imageService,
	}
}

// UploadImageRequest 图片上传请求参数
type UploadImageRequest struct {
	Title       string `form:"title" binding:"required,min=1,max=100"`
	Description string `form:"description" binding:"max=1000"`
}

// BatchUploadImagesRequest 批量上传图片请求参数
type BatchUploadImagesRequest struct {
	Title       string `form:"title" binding:"required,min=1,max=100"`
	Description string `form:"description" binding:"max=1000"`
}

// @Summary 上传图片
// @Description 上传图片文件和相关信息
// @Tags 图片
// @Accept multipart/form-data
// @Produce json
// @Security Bearer
// @Param title formData string true "图片标题"
// @Param description formData string false "图片描述"
// @Param image formData file true "图片文件"
// @Success 200 {object} Response{data=model.Image}
// @Router /api/v1/images [post]
func (c *ImageController) UploadImage(ctx *gin.Context) {
	// 从上下文中获取用户ID
	userID, exists := ctx.Get("userID")
	if !exists {
		// 为了方便测试，默认使用用户ID为1
		userID = 1
	}

	uid, _ := userID.(uint)

	// 绑定表单数据
	var req UploadImageRequest
	if err := ctx.ShouldBind(&req); err != nil {
		logger.Error("Upload image request binding error: " + err.Error())
		ctx.JSON(http.StatusBadRequest, Response{Code: 400, Message: err.Error()})
		return
	}

	// 处理图片文件
	imageFile, _ := ctx.FormFile("image")
	if imageFile == nil {
		ctx.JSON(http.StatusBadRequest, Response{Code: 400, Message: "图片文件不能为空"})
		return
	}

	// 上传图片
	image, err := c.imageService.UploadImage(ctx, imageFile, req.Title, req.Description, uid)
	if err != nil {
		logger.Error("Upload image error: " + err.Error())
		ctx.JSON(http.StatusInternalServerError, Response{Code: 500, Message: err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, Response{Code: 200, Message: "上传成功", Data: image})
}

// GetImageList 获取图片列表
// @Summary 获取图片列表
// @Description 获取图片列表，支持分页和用户筛选
// @Tags 图片
// @Accept json
// @Produce json
// @Param page query int false "页码，默认1"
// @Param pageSize query int false "每页数量，默认10"
// @Param userID query int false "用户ID，可选，用于筛选特定用户的图片"
// @Success 200 {object} Response{data=map[string]interface{}}
// @Router /api/v1/images [get]
func (c *ImageController) GetImageList(ctx *gin.Context) {
	// 获取分页参数
	page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(ctx.DefaultQuery("pageSize", "10"))

	// 验证分页参数
	if page < 1 {
		page = 1
	}
	if pageSize < 1 || pageSize > 100 {
		pageSize = 10
	}

	// 获取用户ID参数（可选）
	userIDStr := ctx.Query("userID")
	var userID *uint
	if userIDStr != "" {
		uid, err := strconv.ParseUint(userIDStr, 10, 64)
		if err == nil {
			uidUint := uint(uid)
			userID = &uidUint
		}
	}

	// 获取图片列表
	images, total, err := c.imageService.GetImageList(ctx, page, pageSize, userID)
	if err != nil {
		logger.Error("Get image list error: " + err.Error())
		ctx.JSON(http.StatusInternalServerError, Response{Code: 500, Message: err.Error()})
		return
	}

	// 返回结果
	ctx.JSON(http.StatusOK, Response{Code: 200, Message: "获取成功", Data: map[string]interface{}{
		"images":   images,
		"total":    total,
		"page":     page,
		"pageSize": pageSize,
	}})
}

// @Summary 批量上传图片
// @Description 同时上传多张图片文件和相关信息
// @Tags 图片
// @Accept multipart/form-data
// @Produce json
// @Security Bearer
// @Param title formData string true "图片集标题"
// @Param description formData string false "图片集描述"
// @Param images formData file true "图片文件列表，最多支持9张图片"
// @Success 200 {object} Response{data=[]model.Image}
// @Router /api/v1/images/batch [post]
func (c *ImageController) BatchUploadImages(ctx *gin.Context) {
	// 从上下文中获取用户ID
	userID, exists := ctx.Get("userID")
	if !exists {
		// 为了方便测试，默认使用用户ID为1
		userID = 1
	}

	uid, _ := userID.(uint)

	// 绑定表单数据
	var req BatchUploadImagesRequest
	if err := ctx.ShouldBind(&req); err != nil {
		logger.Error("Batch upload images request binding error: " + err.Error())
		ctx.JSON(http.StatusBadRequest, Response{Code: 400, Message: err.Error()})
		return
	}

	// 处理图片文件列表
	form, err := ctx.MultipartForm()
	if err != nil {
		logger.Error("Failed to get multipart form: " + err.Error())
		ctx.JSON(http.StatusBadRequest, Response{Code: 400, Message: "获取表单数据失败"})
		return
	}

	// 获取图片文件列表
	imageFiles := form.File["images"]
	if imageFiles == nil || len(imageFiles) == 0 {
		ctx.JSON(http.StatusBadRequest, Response{Code: 400, Message: "图片文件不能为空"})
		return
	}

	// 限制上传数量（最多9张图片）
	if len(imageFiles) > 9 {
		ctx.JSON(http.StatusBadRequest, Response{Code: 400, Message: "最多支持上传9张图片"})
		return
	}

	// 批量上传图片
	images, err := c.imageService.BatchUploadImages(ctx, imageFiles, req.Title, req.Description, uid)
	if err != nil {
		logger.Error("Batch upload images error: " + err.Error())
		ctx.JSON(http.StatusInternalServerError, Response{Code: 500, Message: err.Error()})
		return
	}

	ctx.JSON(http.StatusOK, Response{Code: 200, Message: "上传成功", Data: images})
}
